package practico.patronDAO.impl;

import java.util.ArrayList;
import java.util.List;




import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import practico.entidades.Cliente;
import practico.entidades.Estado;
import practico.entidades.Pedido;
import practico.entidades.Transportista;
import practico.patronDAO.PedidoDAO;

@Component
public class PedidoHibernateDAO implements PedidoDAO {

	private SessionFactory sessionFactory;
	
	@Autowired(required = true)
	  public void setSessionFactory(SessionFactory factory) {
		    this.sessionFactory = factory;
		  }

	  private Session getCurrentSession() {
	    return sessionFactory.getCurrentSession();
	  }

	@Override
	public void crearPedido(Pedido pedido) {
		getCurrentSession().saveOrUpdate(pedido);

	}

	@Override
	public void actualizarPedido(Pedido pedido) {
		getCurrentSession().saveOrUpdate(pedido);

	}

	@Override
	public List<Pedido> buscarPedidos(Estado estado) {
		List list = getCurrentSession().createQuery("SELECT p FROM Pedido p, HistorialPedido h WHERE h.pedido.id=p.id "+
				 "and h.id=(SELECT max(h2.id) FROM HistorialPedido h2 WHERE h2.pedido.id=p.id) and h.estado='"+estado+"'").list();
		if(list==null)
			list=new ArrayList<Pedido>();
	    return list;

	}

	@Override
	public void eliminar(Pedido pedido) {
		getCurrentSession().delete(pedido);

	}

	@Override
	public List<Pedido> buscarPedidosRealizados(Cliente cl) {
		Query q=getCurrentSession().createQuery("FROM Pedido p WHERE p.cliente= :cliente");
		q.setEntity("cliente", cl);
		return q.list();
	}

	@Override
	public List<Pedido> buscarPedidosAsignados(Transportista transportista) {
		Query q=getCurrentSession().createQuery("FROM Pedido p WHERE p.transportista=:transportista");
		q.setEntity("transportista", transportista);
		return q.list();
	}

	@Override
	public void asignarPedidoaTransportista(Pedido pedido, Transportista transportista) {
		getCurrentSession().saveOrUpdate(pedido);
		getCurrentSession().saveOrUpdate(transportista);

	}

	@Override
	public void actualizarEstadoOrden(Pedido pedido) {
		getCurrentSession().saveOrUpdate(pedido);

	}

}
